#include"../include/buffer.h"

void
inibuff(buffer_t * bufferT)
{
	bufferT->actual=0;
	bufferT->ultimo=0;
	bufferT->lleno=0;
}

int
buffisempty(buffer_t * bufferT)
{
	return (bufferT->actual==bufferT->ultimo && !bufferT->lleno);
}

/*ingresa un caracter al buffer, si este se llena, no ingresa mas
 caracteres*/
int
putcharbuff(buffer_t * bufferT, char c)
{
	if(!bufferT->lleno)
	{
		bufferT->buffer[bufferT->actual]=c;
		bufferT->actual=(bufferT->actual+1)%BUFFER_SIZE;
		if(bufferT->actual==bufferT->ultimo)
			bufferT->lleno=1;
		return 1;
	}
	return 0;
}

/*ingresa una cantidad estipulada en el buffer, o una cantidad menor si el
 buffer se llena en el proceso */
int
putbuff(buffer_t * bufferT, char * buffer, int cant)
{
	int i, flag=1;

	for (i = 0; i < cant && flag; i++) {
		flag=putcharbuff(bufferT, buffer[i]);
	}
	return flag? i : i-1;
}

/*igual que putbuff, pero corta en end*/
int
putbuff_until(buffer_t * bufferT, char * buffer, int cant, int end)
{
	int i, flag=1;

	for (i = 0; i < cant && flag && buffer[i] != end; i++) {
		flag=putcharbuff(bufferT, buffer[i]);
	}
	return flag? i : i-1;
}

/*levanta un caracter del buffer*/
int
getcharbuff(buffer_t * bufferT, char * destbuff, int cant)
{
	if(cant==1 && (bufferT->ultimo!=bufferT->actual || bufferT->lleno))
	{
		destbuff[cant-1]=bufferT->buffer[bufferT->ultimo];
		bufferT->ultimo=(bufferT->ultimo+1)%BUFFER_SIZE;
	}
	else
		return 0;
	bufferT->lleno=0;
	return 1;
}

/*remueve un caracter del buffer*/
int
removecharbuff(buffer_t * bufferT)
{
	if(bufferT->ultimo ==bufferT->actual && !bufferT->lleno)
		return 0;
	else
	{
		bufferT->actual=(bufferT->actual-1);
		if(bufferT->actual<0)
			bufferT->actual=bufferT->actual+BUFFER_SIZE;
	}
	bufferT->lleno=0;

	return 1;
}

/*levanta en destbuff, lo que hay en el buffer, hasta llenar el arreglo,
 en el caso en el que haya mas caracteres disponibles en el buffer, este
 los ingnora comenzado el buffer de nuevo */
int
getbuff(buffer_t * bufferT, char * destbuff, int cant)
{
	int i=0;

	if(bufferT->lleno)
	{
		destbuff[i]=bufferT->buffer[bufferT->ultimo];
		bufferT->ultimo=(bufferT->ultimo+1)%BUFFER_SIZE;
		i++;
	}
	for(; bufferT->ultimo!=bufferT->actual && i<cant; ++i)
	{
		destbuff[i]=bufferT->buffer[bufferT->ultimo];
		bufferT->ultimo=(bufferT->ultimo+1)%BUFFER_SIZE;
	}

	bufferT->ultimo=bufferT->actual;
	bufferT->lleno=0;

	return i;
}
